package demo1;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Demo {
    //需求:实例化一个User并调用它的sayHello方法
    //调用方:Demo类    被调用方:User类

    /*
    * 调用方控制着被调用方的创建:
    * 我们是在Demo类中明确的编码实例化被调用方
    * 优点:简单明了
    * 缺点:代码写死了,一旦被调用方因为需求而变化,调用方这边要跟着修改代码
    *      比如被调用方新增了方法,调用方这边也要新增方法
    * */

    //正常的调用
    public static void main(String[] args) throws Exception{
        User user = new User();
        user.sayHello();

        /*
        * 为了避免被调用方因为需求而变化,调用方这边也要跟着修改代码,我们引入了反射机制
        * 优点:灵活,可以动态的创建对象
        * 缺点:要编写大量的反射代码
        *实际开发中,我们一般不会使用反射机制,而是使用框架来帮我们做反射,比如Spring框架
        * */
            Class clazz = Class.forName("demo1.User");
            Object obj = clazz.newInstance();
            User user1 = (User)obj;
            user1.sayHello();

            /*
            * 使用Spring容器
            * 优点:不再需要编写大量反射代码
            *      Spring容器可以进行复杂的对象初始化,后期还可以利用AOP额外添加业务
            * 缺点:需要掌握Spring容器的编程,几乎没什么缺点,轻微侵入性
            * */
        AnnotationConfigApplicationContext context
                = new AnnotationConfigApplicationContext("demo1");
        User user2 =context.getBean(User.class);
        user2.sayHello();
    }
}
